<?php
/**
 * Created by PhpStorm.
 * User: stupboy
 * Date: 2018/5/25
 * Time: 13:58
 * Mail:87658989@qq.com
 */

namespace app\adminapi\model;

use app\base\exception\RecordNotFoundException;
use app\base\exception\BaseException;
use think\exception\DbException;
use think\Model;
use think\Db;

class Common extends Model
{
    const AUTH_SCOPE_SUPER_ADMIN = 'super_admin';   // 超级管理员权限作用域
    const AUTH_SCOPE_COMPANY_SUPER_ADMIN = 'company_super_admin';   // 单位超级管理员作用域
    const AUTH_SCOPE_EITHER = 'either';    // 以上两者之一

    public function checkSearchWhere($where,$limit){
        $ret = true;
        foreach ($where as $k=>$v){
            if(in_array($k,$limit)) continue;
            $ret = false;
            break;
        }
        return $ret;
    }

    /**
     * 根据主键ID获取对应记录并且将记录中的目标字段数据增加到原始数据中
     * @author LRChang <hjklrchang@qq.com>
     * @param $data array 原始数据
     * @param $modelName string 模型类名，包含命名空间
     * @param $id int 主键id
     * @param array $addFields array 需要增加的字段
     * @param string $notFoundMsg 记录不存在时抛出异常的信息
     * @return mixed 该记录
     * @throws RecordNotFoundException
     */
    protected function addRelativeFields(&$data, $modelName, $id, array $addFields, $notFoundMsg = '该记录不存在') {
        $item = $modelName::get($id);
        if(!$item){
            throw new RecordNotFoundException($notFoundMsg);
        }

        foreach($addFields as $key => $field){
            if(is_int($key)){
                $key = $field;
            }
            $data[$field] = $item->getAttr($key);
        }

        return $item;
    }

    /**
     * 闭包查询，添加company_id查询条件
     * @author LRChang <hjklrchang@qq.com>
     * @param $query mixed 闭包查询query对象
     * @param $where mixed 查询条件
     * @param $field string company_id 的查询字段名称，如 'a.company_id'
     * @param $additon callable 附加处理函数，用于添加额外的查询条件
     * @param $need_company_super_admin_auth Boolean 验证是否为单位的超级管理员
     * @throws BaseException
     */
    public static function authCompanyQuery($query, $where, $field = 'company_id', callable $addition = null, $need_company_super_admin_auth = false){

        $session = (new User())->getLoginUser();
        $user_company_id = $session['user']['company_id'];

        if($user_company_id && isset($where[$field])){
            unset($where[$field]);
        }
        $query->where($where);

        if($user_company_id){

            // 验证单位超级管理员权限
            if($need_company_super_admin_auth && (!$session['company'] || !$session['company']['is_company_super_admin'])){
                throw new BaseException('单位绑定的超级管理员才有操作权限');
            }

            if(is_callable($addition)){
                $query->where(function($query) use ($addition, $field, $user_company_id){
                    $addition($query, $field, $user_company_id);
                });
            }else{
                $query->where($field, $user_company_id);
            }
        }
    }

    /**
     * 验证是否为管理员
     * @author LRChang <hjklrchang@qq.com>
     * @param $session array 登录后保存在缓存中的用户信息
     * @param $scope string 验证的权限范围
     * @throws BaseException
     * @return boolean
     */
    public static function checkAdminAuth($session, $scope = self::AUTH_SCOPE_EITHER) {
        switch($scope) {
            case self::AUTH_SCOPE_SUPER_ADMIN:
                if(!self::isSuperAdmin($session)){
                    throw new BaseException('需要超级管理员权限');
                }
                break;

            case self::AUTH_SCOPE_COMPANY_SUPER_ADMIN:
                if(!self::isCompanySuperAdmin($session)){
                    throw new BaseException('需要单位超级管理员权限');
                }
                break;

            default:
                if(!self::isSuperAdmin($session) && !self::isCompanySuperAdmin($session) ){
                    throw new BaseException('需要超级管理员权限或者单位超级管理员权限');
                }
        }

        return true;
    }

    /**
     * 是否为超级管理员
     * @author LRChang <hjklrchang@qq.com>
     * @param $session array 登录后保存在缓存中的用户信息
     * @return boolean
     */
    public static function isSuperAdmin($session) {
        return $session && $session['user'] && $session['user']['is_super_admin'];
    }

    /**
     * 是否为单位超级管理员
     * @author LRChang <hjklrchang@qq.com>
     * @param $session array 登录后保存在缓存中的用户信息
     * @return boolean
     */
    public static function isCompanySuperAdmin($session) {
        return $session && $session['company'] && $session['company']['is_company_super_admin'];
    }
}